package cn.yinyu.queue.module.ecg.service.queue;

import javax.validation.Valid;
import java.util.List;

import cn.yinyu.queue.framework.common.exception.ErrorCode;
import cn.yinyu.queue.framework.common.pojo.CommonResult;
import cn.yinyu.queue.module.ecg.controller.admin.queue.vo.*;
import cn.yinyu.queue.module.ecg.controller.admin.room.vo.MonitorInfoVO;
import cn.yinyu.queue.module.ecg.controller.admin.room.vo.RoomRespVO;
import cn.yinyu.queue.module.ecg.dal.dataobject.queue.QueueDO;
import cn.yinyu.queue.framework.common.pojo.PageResult;
import cn.yinyu.queue.module.ecg.dal.dataobject.room.RoomDO;

/**
 * 排队 Service 接口
 *
 * @author 垠域源码
 */
public interface QueueService {

    void initCheckType();
    void startBiz();
    void closeBiz();


    /**
     * 创建排队
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Integer createqueue(@Valid QueueSaveReqVO createReqVO);

    /**
     * 更新排队
     *
     * @param updateReqVO 更新信息
     */
    void updatequeue(@Valid QueueSaveReqVO updateReqVO);

    /**
     * 删除排队
     *
     * @param id 编号
     */
    void deletequeue(Integer id);

    /**
     *
     */
    void startHurryUpOneBed(Long roomId, String bedNo);
    void startHurryUpOneCheckType(Integer checkType);

    void startBedReload();
    void startResetRoom(Boolean needCloseBed);
    MonitorInfoVO getMonitorInfo();

    ErrorCode startBedOpen(Long roomId, String roomName, String bedNo);
    ErrorCode startBedClose(Long roomId, String bedNo);
    ErrorCode startBedDoctorPause(Long roomId, String bedNo, Long docId, String docName);
    ErrorCode startBedDoctorResume(Long roomId, String bedNo, Long docId, String docName);
    ErrorCode startBedDoctorOn(Long roomId, String bedNo, Long docId, String docName);
    ErrorCode startBedDoctorOff(Long roomId, String bedNo, Long docId, String docName);
    ErrorCode startNextPatient(Long roomId, String bedNo);
    ErrorCode startNextInstallPatient(Long roomId, String bedNo);

    CommonResult<RoomRespVO> getRoom(Long roomId, String bedNo, Long docId);

    /**
     * 获得排队
     *
     * @param id 编号
     * @return 排队
     */
    QueueDO getqueue(Integer id);

    /**
     * 获得排队分页
     *
     * @param pageReqVO 分页查询
     * @return 排队分页
     */
    PageResult<QueueDO> getqueuePage(QueuePageReqVO pageReqVO);

    /**
     * 患者排队
     * @param queueSaveReqVO
     */
    void queue(QueueSaveReqVO queueSaveReqVO);

    List<QueueDO> selectBookSeqNumByAppointIdList(List<Long> appointIdList);

    /**
     * 常规检查 医生叫下一位患者
     */
    void finishNextPatient(Long roomId, String bedNo);

    /**
     * 领用 医生叫下一位患者
     */
    void finishReceiveNextPatient(Long roomId, String bedNo);

    /**
     * 装机 医生叫下一位患者
     */
    void finishInstallNextPatient(Long roomId, String bedNo);

    /**
     * 过号排队中患者
     */
    void passWaitingPatient( String patId, Integer bookCheckType );

    /**
     * 常规过号、领用过号
     */
    void passNextPatient(Long roomId, String bedNo);

    /**
     * 装机过号
     */
    void passInstallNextPatient(Long roomId, String bedNo);

    List<QueueDO> getBedQueueByStatus(Long roomId, String bedNo, List<Integer> statusList);

    List<QueueDO> getRoomQueueByStatus(Long roomId, List<Integer> statusList);

    PatientStatisticVO getPatientStatistic(Long roomId, String bedNo);

    PatientStatisticVO getBedDevReadyStatistic(Long roomId, String bedNo);

    PatientStatisticVO getBedDevInstallStatistic(Long roomId, String bedNo);

    Integer recallPassWaitingPatient(String patId, Integer checkType);

    Integer recallPatient(Long roomId, String bedNo, String patId, Integer checkType);

    Integer recallInstallPatient(Long roomId, String bedNo, String patId, Integer checkType, Long roomId_operator, String bedNo_operator);

    Integer patientJump(String patId, Byte jumped );

    List<RoomDO> getDocRoomInfo(Long docId);

    List<QueueDO> getToBeCheckedPatient(Long roomId, String bedNo);

    List<QueueDO> getToBeInstalledPatient(Long roomId, String bedNo);
}
